#ifndef _LISTENING_OBJECT_H_
#define _LISTENING_OBJECT_H_

#include <vector>
#include "eventListener.h"
#include "collaboration.h"

/**
* @brief Clase que modela un objeto que acepta listeners de
*        eventos distribuidos
* @author Carlos Rodriguez Dominguez
* @date 17/11/2008
*
* Estos objetos se podran registrar en el manejador de eventos 
* para enviar y recibir eventos distribuidos. Todo componente
* que desee recibir este tipo de eventos debera heredar de esta
* clase o disponer de una instancia de ella. Para recibir un
* tipo concreto de eventos, debera crearse un listener apropiado.
*/
class ListeningObject {
public:
	/**
	* Constructor
	*/
	ListeningObject();
	
	/**
	* Destructor
	*/
	~ListeningObject();
	
	/**
	* Agrega un listener nuevo al objeto
	*
	* @param ev Listener a agregar
	*/
	void addEventListener(EventListener& ev);
	
	/**
	* Elimina un listener del objeto
	*
	* @param ev Listener a eliminar
	*/
	void removeEventListener(EventListener& ev);
	
	/**
	* Elimina un listener del objeto
	*
	* @param name Nombre del listener a eliminar
	*/
	void removeEventListener(const ::std::string& name);
	
	/**
	* Busca los listeners que soporten el evento y
	* los obliga a ejecutar la accion asociada.
	*
	* @param data Evento
	*/
	void listen(Event& evt);
	
private:
	
	/**
	* Busca la posicion de un listener en el vector
	* de listeners.
	*
	* @param name Nombre de listener a buscar
	* @return Posicion del listener o -1 si no existe
	*/
	int getListenerPos(const ::std::string& name);
	
	::std::vector<EventListener*> listeners; /**< Vector de listeners */
};

#endif
